import { observer } from './observe/index'

export function initState(vm) {
  let opts = vm.$options
  if (opts.props) {
    initProps()
  }
  if (opts.data) {
    initData(vm)
  }
  if (opts.watch) {
    initWatch()
  }
  if (opts.computed) {
    initComputed()
  }
  if (opts.methods) {
    initmethods()
  }
}

function initProps() {}
// 对 data 初始化
function initData(vm) {
  // data 的数据可能是对象 也可能是函数
  let data = vm.$options.data
  data = vm._data = typeof data === 'function' ? data.call(vm) : data // 把 this 改成 vue实例
  // 将 data 上的所有属性代理到 实例上 vm
  // console.log(data)
  for (let key in data) {
    // console.log(key)
    proxy(vm, '_data', key)
  }
  // data 数据劫持
  observer(data)
}
function initWatch() {}
function initComputed() {}
function initmethods() {}

// 将 data 上的所有属性代理到 实例上 vm
function proxy(vm, source, key) {
  // console.log(vm, source, key)
  Object.defineProperty(vm, key, {
    get() {
      // console.log(vm)
      return vm[source][key]
    },
    set(newValue) {
      vm[source][key] = newValue
    }
  })
}
